tiny-c gotchas.html - lrb - 6/12/14

This is my attempt to save you some time by telling you my experiences with tiny-c programs that weren't working.

1.

Early on I had trouble remembering that the source code of programs written in tiny-c had to be linefeed delimited. This is no longer the case because I figured out how to modify the tiny-c shell function progin (gi) to strip out carriage returns from carriage return linefeed delimited files. This is a good example of tiny-c's ability to enhance itself. By the way, you can tell if a tiny-c program has carriage returns in it when you load them because the number of bytes read and the number of bytes loaded differ. These numbers are reported by the shell command .r (which reads program source in).

tc>.r cb.tc
 814
 0 28 786 23714
tc>

The 814 is the number of bytes in cb.tc. The four numbers on the next line are the current line number, number of lines, number of bytes loaded and number of bytes still available. Notice that 814-786=28 (28 carriage returns got stripped).

2.

When you run tiny-c programs and then make changes with the shell's editor and then use the shell's .w command to write out the new source code, if you later use an external editor on the source, it looks like it has been truncated! This is due to the fact that the interpreter replaces the trailing quotes in character strings with nulls. External editors just drop everything after these nulls. This fact led me to write the tiny-c program ntq.tc to turn nulls into quotes just so I could once again use my external editor.

3.

There are important differences between the (currently) three different versions of tiny-c. The CP/M version does not support the for statement or the unary operators ++, -- and !. The PC/DOS version uses 16-bit integers. The Linux version uses 32-bit integers. This means, for example, that the tiny-c program crypt.tc won't work in the PC/DOS version, because it does things like

z=10000*m+1000*o+100*n+10*e+y

and if m is, say, 5, the 16-bit integers can't handle 50000. The largest 16-bit integer is 32767. The largest 32-bit integer is 2147483647. The binary tree sort program (tree.ipl) reveals other things you have to worry about from version to version. Interpreter sizing constants which control how big program source code can be etc. and this 16-bit (2-byte) / 32-bit (4-byte) integer issue play a role here.

4.

Hard-to-remember "weirdnesses" remain in the interpreters which involve the need to put code on separate lines, not on a single line. It's best to keep it simple and write if-else, for and while statements like so:

if (   ) [
  blah
  ]
else [
  blah
  ]
  
for (  ) [
  blah
  ]

while (  ) [
  blah
  ]
Note: if you do use an else statement and put it on the same line as the if, you must have a semicolon after the if.

if (   ) foo;else bar

Also, don't put a comment or an extra blank line at the tail end of your tiny-c programs! They may not work if you do! Trust me.

Furthermore, I seem to have to add a dummy function like foo [] at the end of a program like size.tc. Without foo, it does not work.

It seems programs *must* be crlf delimited in the CP/M version.

5.

Case matters. Like C, case matters in tiny-c. It's best to use lowercase function and variable names. Porting tiny-c programs from PC/DOS to Linux often involves lowercasing filenames as well.

6.

The only way to learn tiny-c is to write programs in it! Here's a good one to try.

Write a program in tiny-c that prints out the multiplication tables from 1*1 to 12*12.

tc>.r mult.tc
 271
 0 16 271 89729
tc>.mult

mult.tc - 1/10/9 - lrb

Press Enter ...

 1 * 1 = 1
 1 * 2 = 2
 1 * 3 = 3
 1 * 4 = 4
 1 * 5 = 5
 1 * 6 = 6
 1 * 7 = 7
 1 * 8 = 8
 1 * 9 = 9
 1 * 10 = 10
 1 * 11 = 11
 1 * 12 = 12

Press Enter ...

 2 * 1 = 2
 2 * 2 = 4
 2 * 3 = 6
 2 * 4 = 8
 2 * 5 = 10
 2 * 6 = 12
 2 * 7 = 14
 2 * 8 = 16
 2 * 9 = 18
 2 * 10 = 20
 2 * 11 = 22
 2 * 12 = 24

Press Enter ...

Here's how I did it.

This runs under the tiny-c shell: mult.tc

This runs as a standalone: mult.ipl

7.

You can't declare and simultaneously initialize variables in tiny-c.

You get a Segmentation error message when you use the shell command .r on a non-existent file (under Linux).

tiny-c program file names should have an "8.3 format." Example: abcdefgh.ijk. The standard file type is .tc.

Memory is limited. Keep the number of variables and functions, array sizes and program length small.

Parentheses are sometimes optional. For example:

while i<br

is OK, but you need parentheses when the expression gets more complex.

if ((foo)*(bar))

Have fun!

TcT ("Tiny-c Tim")